home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / cit.arc / CTDL.C < prev    next >
C/C++ Source or Header  |  1986-01-22  |  28KB  |  1,038 lines

  1. /************************************************************************/
  2. /*                ctdl.c                    */
  3. /*        Command-interpreter code for Citadel            */
  4. /************************************************************************/
  5.  
  6. #include "ctdl.h"
  7.  
  8. #define VERSION "2.07"
  9.  
  10. /************************************************************************/
  11. /*                history                 */
  12. /*                                    */
  13. /* 85Nov19 HAW    Kill visible switch.                    */
  14. /* 85Nov17 HAW    Add <U>ngoto command.                    */
  15. /* 85Oct16 HAW    Add <I> command to sysop menu.                */
  16. /* 85Aug31 HAW    Fix doLogout to handle carrier loss during confirmation.*/
  17. /* 85Jul06 HAW    Add code for crash message in Aide, and .K option.    */
  18. /* 85Jul01 HAW    Add option to read host files in formatted form.    */
  19. /* 85Jun03 HAW    Add exit values.                    */
  20. /* 85Jun03 HAW    Put in networking stuff.                */
  21. /* 85Feb20 HAW    IMPERVIOUS flag implemented.                */
  22. /* 85Jan14 HAW    doHelp() fixed so no overflows of file names can occur. */
  23. /* 84Sep19 HAW    Now all aide functions have some form of CONFIRM.    */
  24. /* 84Sep11 HAW    SysOp privileges now ^l; ^p filtered by MSDOS.        */
  25. /* 84Aug30 HAW    And now for the plunge into ... MS-DOS!         */
  26. /* 84Aug23 HAW & JLS  JLS's Forget scheme implemented.            */
  27. /* 84JuL12 HAW & JLS  <S>kip implemented.                */
  28. /* 84JuL06 HAW    ALL FILES: make putChar the bottleneck!         */
  29. /* 84Jun26 JLS & HAW  Commented out extra params to putRoom & getRoom.    */
  30. /* 84Jun21 JLS    Fix ".Read" so can't have endless "reverse forward..."    */
  31. /* 84Jun10 JLS    Implement "user must log in to create room."        */
  32. /* 84Jun10 JLS    Mod for changing date from other than system console.    */
  33. /* 84May18 JLS/HAW Greeting modified for coherency.            */
  34. /* 84Apr04 HAW    Upgrade to BDS 1.50a begun.                */
  35. /* 83Mar08 CrT    Aide-special functions installed & tested...        */
  36. /* 83Feb24 CrT/SB Menus rearranged.                    */
  37. /* 82Dec06 CrT    2.00 release.                        */
  38. /* 82Nov05 CrT    removed main() from room2.c and split into sub-fn()s    */
  39. /************************************************************************/
  40.  
  41. /************************************************************************/
  42. /*                Contents                */
  43. /*                                    */
  44. /*    doAide()        handles Aide-only    commands    */
  45. /*    doChat()        handles C(hat)        command     */
  46. /*    doEnter()        handles E(nter)     command     */
  47. /*    doForget()        handles Z(Forget room)    command     */
  48. /*    doGoto()        handles G(oto)        command     */
  49. /*    doHelp()        handles H(elp)        command     */
  50. /*    doKnown()        handles K(nown rooms)    command     */
  51. /*    doLogin()        handles L(ogin)     command     */
  52. /*    doLogout()        handles T(erminate)    command     */
  53. /*    doRead()        handles R(ead)        command     */
  54. /*    doRegular()        fanout for above commands        */
  55. /*    doSkip()        handles S(kip)        command     */
  56. /*    doSysop()        handles sysop-only    commands    */
  57. /*    doUngoto()        handles U(ngoto)    command     */
  58. /*    getCommand()        prints prompt and gets command char    */
  59. /*    greeting()        System-entry blurb etc            */
  60. /*    main()            has the central menu code        */
  61. /************************************************************************/
  62.  
  63. /************************************************************************/
  64. /*        External declarations in CTDL.C             */
  65. /************************************************************************/
  66. char   ExitToMsdos = FALSE;    /* True when time to bring system down    */
  67. int    exitValue = CRASH_EXIT;
  68.  
  69. /************************************************************************/
  70. /*        External variable definitions for CTDL.C        */
  71. /************************************************************************/
  72. extern struct config cfg;    /* The main variable to be saved    */
  73. extern struct aRoom    roomBuf;    /* Room buffer            */
  74. extern struct msgB    msgBuf;     /* Message buffer        */
  75. extern struct msgB    tempMess;    /* Message buffer        */
  76. extern struct logBuffer logBuf;     /* Person's log buffer        */
  77. extern struct rTable    roomTab[];    /* Room index for RAM        */
  78. extern struct lTable    *logTab;    /* Log    index for RAM        */
  79. extern long        FDSectCount;    /* size of files in directory    */
  80. extern int        thisRoom;    /* Current room         */
  81. extern long int     pulledMLoc;    /* Loc of msg to be pulled    */
  82. extern ulong        pulledMId;    /* Id of msg to be pulled    */
  83. extern char        onConsole;    /* Where IO is ...        */
  84. extern char        whichIO;    /* Where IO is ...        */
  85. extern char        outFlag;
  86. extern char        expert;     /* User expert?         */
  87. extern char        aide;        /* User aide?            */
  88. extern char        loggedIn;    /* Are we logged in?        */
  89. extern char        echo;
  90. extern char        newCarrier;    /* Just got carrier, hurrah!    */
  91. extern char        justLostCarrier;/* Boo, hiss!            */
  92. extern char        usingWCprotocol;/* WC protocol flag        */
  93. extern char        textDownload;    /* flag             */
  94. extern char        haveCarrier;
  95. extern char        *baseRoom;
  96. extern int        lastRoom;    /* For Ungoto command        */
  97. extern char        heldMess;
  98. extern char        anyEcho;
  99.  
  100. extern int    acount;
  101. #define AUDIT    9000
  102. extern char    audit[AUDIT];
  103.  
  104. /************************************************************************/
  105. /*        External function definitions for CTDL.C        */
  106. /************************************************************************/
  107. char toUpper();
  108. char iChar();
  109.  
  110. /************************************************************************/
  111. /*    doAide() handles the aide-only menu                */
  112. /*        return FALSE to fall invisibly into default error msg    */
  113. /************************************************************************/
  114. char doAide(moreYet, first)
  115. char moreYet;
  116. char first;    /* first parameter if TRUE        */
  117. {
  118.     label oldName;
  119.     int  rm, roomExist();
  120.     char chatStack;
  121.  
  122.     if (!aide)     return FALSE;
  123.  
  124.     if (moreYet)   first = '\0';
  125.  
  126.     mPrintf("ide special fn: ");
  127.  
  128.     if (first)       oChar(first);
  129.  
  130.     switch (toUpper(   first ? first : iChar()      )) {
  131.     case 'C':
  132.     chatStack = cfg.noChat;
  133.     cfg.noChat = FALSE;
  134.     mPrintf("hat\n ");
  135.     if (whichIO == MODEM)        ringSysop();
  136.     else                interact() ;
  137.     cfg.noChat = chatStack;
  138.     break;
  139.     case 'D':
  140.     sPrintf(msgBuf.mbtext, "The following empty rooms deleted by %s: ",
  141.                         logBuf.lbname);
  142.     mPrintf("elete empty rooms\n ");
  143.     if (!getYesNo("confirm"))
  144.        break;
  145.     strCpy(oldName, roomBuf.rbname);
  146.     indexRooms();
  147.  
  148.     if ((rm=roomExist(oldName)) != ERROR)    getRoom(rm);
  149.     else                    getRoom(LOBBY);
  150.  
  151.     aideMessage( /* noteDeletedMessage== */ FALSE );
  152.     break;
  153.     case 'E':
  154.     mPrintf("dit room\n  \n");
  155.     strCpy(oldName, roomBuf.rbname);
  156.     if (!renameRoom())   break;
  157.     sPrintf(
  158.         msgBuf.mbtext,
  159.         "%s> edited to %s> by %s",
  160.         oldName,
  161.         roomBuf.rbname,
  162.         logBuf.lbname
  163.     );
  164.     aideMessage( /* noteDeletedMessage == */ FALSE);
  165.     break;
  166.     case 'S':
  167.     mPrintf("et Date\n ");
  168.     changeDate();
  169.     break;
  170.     case 'I':
  171.     mPrintf("nsert message\n ");
  172.     if (
  173.         thisRoom   == AIDEROOM
  174.         ||
  175.         pulledMId  == 0l
  176.     )   {
  177.         mPrintf("nope!");
  178.         break;
  179.     }
  180.     if (!getYesNo("confirm"))
  181.         break;
  182.     note2Message(pulledMId, pulledMLoc);
  183.     putRoom(thisRoom);
  184.     noteRoom();
  185.     sPrintf(
  186.         msgBuf.mbtext,
  187.         "Following message inserted in %s> by %s",
  188.         roomBuf.rbname,
  189.         logBuf.lbname
  190.     );
  191.     aideMessage( /* noteDeletedMessage == */ TRUE);
  192.     break;
  193.     case 'K':
  194.     mPrintf("ill room\n ");
  195.     if (
  196.         thisRoom == LOBBY
  197.         ||
  198.         thisRoom == MAILROOM
  199.         ||
  200.         thisRoom == AIDEROOM
  201.     ) {
  202.         mPrintf(" not here!");
  203.         break;
  204.     }
  205.     if (!getYesNo("confirm"))   break;
  206.  
  207.     sPrintf(
  208.         msgBuf.mbtext,
  209.         "%s> killed by %s",
  210.         roomBuf.rbname,
  211.         logBuf.lbname
  212.     );
  213.     aideMessage( /* noteDeletedMessage == */ FALSE);
  214.  
  215.     roomBuf.rbflags.INUSE = FALSE;
  216.     putRoom(thisRoom);
  217.     noteRoom();
  218.     getRoom(LOBBY);
  219.     break;
  220.     case '?':
  221.     tutorial("aide.mnu");
  222.     break;
  223.     default:
  224.     if (!expert)    mPrintf(" ?(Type '?' for menu)\n "    );
  225.     else        mPrintf(" ?\n "             );
  226.     break;
  227.     }
  228.     return TRUE;
  229. }
  230.  
  231. /************************************************************************/
  232. /*    doChat()                            */
  233. /************************************************************************/
  234. doChat(moreYet, first)
  235. char moreYet;    /* TRUE to accept following parameters    */
  236. char first;    /* first parameter if TRUE        */
  237. {
  238.     if (moreYet)   first = '\0';
  239.  
  240.     if (first)       oChar(first);
  241.  
  242.     mPrintf("hat ");
  243.  
  244.     if (cfg.noChat)   {
  245.     tutorial("nochat.blb");
  246.     return;
  247.     }
  248.  
  249.     if (whichIO == MODEM)    ringSysop();
  250.     else            interact() ;
  251. }
  252.  
  253. /************************************************************************/
  254. /*    doEnter() handles E(nter) command                */
  255. /************************************************************************/
  256. doEnter(moreYet, first)
  257. char moreYet;    /* TRUE to accept following parameters    */
  258. char first;    /* first parameter if TRUE        */
  259. {
  260. #define CONFIGURATION    0
  261. #define MESSAGE     1
  262. #define PASSWORD    2
  263. #define ROOM        3
  264. #define FILE        4
  265. #define CONTINUED    5
  266. #define NETWORK     6
  267.     char what;            /* one of above five */
  268.     char abort, done, WC;
  269.  
  270.     if (moreYet)   first = '\0';
  271.  
  272.     abort    = FALSE  ;
  273.     done    = FALSE  ;
  274.     WC        = FALSE  ;
  275.     what    = MESSAGE;
  276.  
  277.     mPrintf("nter ");
  278.  
  279.     if (!loggedIn  &&  !cfg.unlogLoginOk  &&  thisRoom!=MAILROOM)   {
  280.     mPrintf("--Must log in to enter (except in Mail>)\n ");
  281.     return;
  282.     }
  283.  
  284.     if (first)       oChar(first);
  285.  
  286.     do    {
  287.     outFlag = OUTOK;
  288.  
  289.     switch (toUpper(   first ? first : iChar()   )) {
  290.     case '\r':
  291.     case '\n':
  292.         moreYet    = FALSE;
  293.         break;
  294.     case 'F':
  295.         if (roomBuf.rbflags.MSDOSDIR == 1) {
  296.         mPrintf("ile upload ");
  297.         what    = FILE;
  298.         done    = TRUE;
  299.         break;
  300.         }
  301.     default:
  302.         mPrintf("? ");
  303.         abort    = TRUE;
  304.         if (expert)  break;
  305.     case '?':
  306.         tutorial("entopt.mnu");
  307.         abort    = TRUE;
  308.         break;
  309.     case 'C':
  310.         mPrintf("onfiguration ");
  311.         what    = CONFIGURATION;
  312.         done    = TRUE;
  313.         break;
  314.     case 'F':
  315.         mPrintf("ile upload "    );
  316.         WC        = TRUE;
  317.         done    = TRUE;
  318.         break;
  319.     case 'M':
  320.         mPrintf("essage "       );
  321.         what    = MESSAGE;
  322.         done    = TRUE;
  323.         break;
  324.     case 'P':
  325.         mPrintf("assword "       );
  326.         what    = PASSWORD     ;
  327.         done    = TRUE;
  328.         break;
  329.     case 'R':
  330.         mPrintf("oom "       );
  331.         if (!cfg.nonAideRoomOk && !aide)   {
  332.         mPrintf(" ?-- must be aide to create room\n ");
  333.         abort    = TRUE;
  334.         break;
  335.         }
  336.         if (!loggedIn) {
  337.         mPrintf("!Must log in to create a new room\n");
  338.         abort = TRUE;
  339.         break;
  340.         }
  341.         what    = ROOM;
  342.         done    = TRUE;
  343.         break;
  344.         case 'H':
  345.             mPrintf("eld Message ");
  346.             what = CONTINUED;
  347.             done = TRUE;
  348.             break;
  349.     case 'N':
  350.         mPrintf("et-Message ");
  351.         what = NETWORK;
  352.             done = TRUE;
  353.             break;
  354.     }
  355.     first = '\0';
  356.     } while (!done && moreYet && !abort);
  357.  
  358.     doCR();
  359.  
  360.     if (!abort) {
  361.     if (whichIO != CONSOLE && thisRoom == MAILROOM) echo = CALLER;
  362.     switch (what) {
  363.     case CONFIGURATION  :    configure(loggedIn);       break;
  364.     case MESSAGE        :    makeMessage(WC, NULL,
  365.                         0, FALSE) ;    break;
  366.     case PASSWORD        :    newPW()        ;       break;
  367.     case ROOM        :    makeRoom()       ;       break;
  368.     case FILE        :    upLoad()       ;       break;
  369.     case CONTINUED        :    makeMessage(WC, NULL,
  370.                         1,
  371.                    tempMess.mbaddr[0]) ;       break;
  372.     case NETWORK        :    netMessage()       ;       break;
  373.     }
  374.     echo = BOTH;
  375.     }
  376. }
  377.  
  378. /************************************************************************/
  379. /*    doForget() handles (Forget room) command            */
  380. /************************************************************************/
  381. doForget(expand, first)
  382. char expand, first;
  383. {
  384.     int i;
  385.  
  386.     if (!expand) {
  387.     mPrintf("\bForget %s \n ", roomBuf.rbname);
  388.     if (thisRoom == LOBBY     ||
  389.         thisRoom == MAILROOM ||
  390.         thisRoom == AIDEROOM) {
  391.         mPrintf("!Can't forget this room! \n ");
  392.         return ;
  393.     }
  394.     if (!getYesNo("confirm"))   return;
  395.     i = (roomBuf.rbgen + FORGET_OFFSET) % MAXGEN;    /* Set up offset*/
  396.     logBuf.lbgen[thisRoom] = i << GENSHIFT;     /* Save it    */
  397.     gotoRoom(baseRoom, 'S');
  398.     }
  399.     else {
  400.     mPrintf("\b\b ");
  401.     listRooms(/* doDull == */ FORGOT);
  402.     }
  403. }
  404.  
  405. /************************************************************************/
  406. /*    doGoto() handles G(oto) command                 */
  407. /************************************************************************/
  408. doGoto(expand, first)
  409. char expand;    /* TRUE to accept following parameters    */
  410. char first;    /* first parameter if TRUE        */
  411. {
  412.     label roomName;
  413.  
  414.     outFlag = IMPERVIOUS;
  415.     mPrintf("oto ");
  416.  
  417.     if (!expand) {
  418.     gotoRoom("", 'R');
  419.     return;
  420.     }
  421.  
  422.     getNormStr("", roomName, NAMESIZE, ECHO);
  423.  
  424.     if (roomName[0] == '?')    listRooms(/* doDull== */ ALMOST_ALL);
  425.     else            gotoRoom(roomName, 'R');
  426. }
  427.  
  428. /************************************************************************/
  429. /*    doHelp() handles H(elp) command                 */
  430. /************************************************************************/
  431. doHelp(expand, first)
  432. char expand;    /* TRUE to accept following parameters    */
  433. char first;    /* first parameter if TRUE        */
  434. {
  435.     label fileName;
  436.  
  437.     mPrintf("elp ");
  438.     if (!expand) {
  439.     mPrintf("\n\n");
  440.     tutorial("dohelp.hlp");
  441.     return;
  442.     }
  443.  
  444.     getNormStr("", fileName, 9, ECHO);
  445.     if (strLen(fileName) == 0)
  446.     strCpy(fileName, "dohelp");
  447.     if (fileName[0] == '?')    tutorial("helpopt.hlp");
  448.     else {
  449.     /* adding the extention makes things look simpler for        */
  450.     /* the user... and restricts the files which can be read    */
  451.     strCat(fileName, ".hlp");
  452.     tutorial(fileName);
  453.     }
  454. }
  455.  
  456. /************************************************************************/
  457. /*    doKnown() handles K(nown rooms) command.            */
  458. /************************************************************************/
  459. doKnown(expand, first)
  460. char expand;    /* TRUE to accept following parameters    */
  461. char first;    /* first parameter if TRUE        */
  462. {
  463.     mPrintf("nown rooms ");
  464.     if (!expand) {
  465.     mPrintf("\n ");
  466.     listRooms(/* doDull== */ ALMOST_ALL);
  467.     }
  468.     else
  469.     searchRooms();
  470. }
  471.  
  472. /************************************************************************/
  473. /*    doLogin() handles L(ogin) command                */
  474. /************************************************************************/
  475. doLogin(moreYet, first)
  476. char moreYet;    /* TRUE to accept following parameters    */
  477. char first;    /* first parameter if TRUE        */
  478. {
  479.     label passWord;
  480.  
  481.     mPrintf("ogin ");
  482.     if (!moreYet)   mPrintf("\n");
  483.     if (loggedIn)   {
  484.     mPrintf("\n ?Already logged in!\n ");
  485.     return;
  486.     }
  487.     echo    = CALLER;
  488.     getNormStr(moreYet ? "" : " password", passWord, NAMESIZE,
  489.                      (moreYet) ? ECHO : NO_ECHO);
  490.     echo    = BOTH;
  491.     login(passWord);
  492. }
  493.  
  494. /************************************************************************/
  495. /*    doLogout() handles T(erminate) command                */
  496. /************************************************************************/
  497. doLogout(expand, first)
  498. char expand;    /* TRUE to accept following parameters    */
  499. char first;    /* first parameter if TRUE        */
  500. {
  501.  
  502.     if (expand)   first = '\0';
  503.  
  504.     mPrintf("erminate ");
  505.  
  506.     if (heldMess)
  507.      mPrintf("\n WARNING: You have a message in your Hold Message Buffer!\n ");
  508.  
  509.     if (first)     oChar(first);
  510.  
  511.     switch (toUpper(    first ? first : iChar()    )) {
  512.     case '?':
  513.     mPrintf("\n Logout options:\n \n ");
  514.  
  515.     mPrintf("Quit-also\n "        );
  516.     mPrintf("Stay\n "        );
  517.     break;
  518.     case 'Q':
  519.     mPrintf("uit-also\n ");
  520.     if (!expand)   {
  521.        if (!getYesNo("confirm"))   break;
  522.     }
  523.     if (!onLine()) break;
  524.     terminate( /* hangUp == */ TRUE);
  525.     break;
  526.     case 'S':
  527.     mPrintf("tay\n ");
  528.     terminate( /* hangUp == */ FALSE);
  529.     break;
  530.     }
  531. }
  532.  
  533. /************************************************************************/
  534. /*    doRead() handles R(ead) command                 */
  535. /************************************************************************/
  536. doRead(moreYet, first)
  537. char moreYet;    /* TRUE to accept following parameters    */
  538. char first;    /* first parameter if TRUE        */
  539. {
  540.     int  fDir(), transmitFile(), formatFile();
  541.     char abort, doDir, done, hostFile, whichMess, revOrder, status, WC;
  542.     char formatted;
  543.     label fileName;
  544.  
  545.  
  546.     if (moreYet)   first = '\0';
  547.  
  548.     mPrintf("\bread ");
  549.  
  550.     abort    = FALSE;
  551.     doDir    = FALSE;
  552.     hostFile    = FALSE;
  553.     revOrder    = FALSE;
  554.     status    = FALSE;
  555.     WC        = FALSE;
  556.     formatted    = FALSE;
  557.     whichMess    = NEWoNLY;
  558.  
  559.     if (thisRoom == MAILROOM && !loggedIn  &&  !cfg.unlogReadOk)   {
  560.     showMessages(whichMess, revOrder);
  561.     return;
  562.     }
  563.  
  564.     if (!loggedIn  &&  !cfg.unlogReadOk)   {
  565.     mPrintf("Must log in to read\n ");
  566.     return;
  567.     }
  568.  
  569.     if (first)       oChar(first);
  570.  
  571.     do {
  572.     outFlag = OUTOK;
  573.     done = TRUE;
  574.  
  575.     switch (toUpper(   first ? first : iChar()   )) {
  576.     case '\n':
  577.     case '\r':
  578.         moreYet    = FALSE;
  579.         break;
  580.     case 'A':
  581.         if (hostFile) break;
  582.         mPrintf("ll");
  583.         whichMess    = OLDaNDnEW;
  584.         break;
  585.     case 'F':
  586.         if (!hostFile) {
  587.         mPrintf("orward");
  588.         revOrder    = FALSE;
  589.         whichMess   = OLDaNDnEW;
  590.         }
  591.         else {
  592.         mPrintf("ormatted");
  593.         formatted = TRUE;
  594.         }
  595.         break;
  596.     case 'G':
  597.         if (hostFile) break;
  598.         mPrintf("lobal new-messages");
  599.         whichMess    = GLOBALnEW;
  600.         break;
  601.     case 'N':
  602.         if (hostFile) break;
  603.         mPrintf("ew ");
  604.         whichMess    = NEWoNLY;
  605.         break;
  606.     case 'O':
  607.         if (hostFile) break;
  608.         mPrintf("ld Reverse");
  609.         revOrder    = TRUE;
  610.         whichMess    = OLDoNLY;
  611.         break;
  612.     case 'R':
  613.         if (hostFile) break;
  614.         mPrintf("everse");
  615.         revOrder    = TRUE;
  616.         whichMess    = OLDaNDnEW;
  617.         break;
  618.     case 'S':
  619.         if (hostFile) break;
  620.         mPrintf("tatus\n ");
  621.         status    = TRUE;
  622.         break;
  623.     case 'W':
  624.         if (hostFile) break;
  625.         mPrintf("C protocol ");
  626.         WC        = TRUE;
  627.         done    = FALSE;
  628.         break;
  629.     case 'B':
  630.         if (hostFile) break;
  631.         if (roomBuf.rbflags.MSDOSDIR == 1)     {
  632.         mPrintf("inary file(s) ");
  633.         hostFile    = TRUE ;
  634.         textDownload    = FALSE;
  635.         break;
  636.         }
  637.     case 'D':
  638.         if (hostFile) break;
  639.         if (roomBuf.rbflags.MSDOSDIR == 1)     {
  640.         mPrintf("irectory ");
  641.         doDir    = TRUE;
  642.         break;
  643.         }
  644.     case 'T':
  645.         if (hostFile) break;
  646.         if (roomBuf.rbflags.MSDOSDIR == 1)     {
  647.         mPrintf("extfile(s) ");
  648.         hostFile    = TRUE;
  649.         textDownload    = TRUE;
  650.         if (!WC) done    = FALSE;
  651.         break;
  652.         }
  653.     default:
  654.         mPrintf("? ");
  655.         abort    = TRUE;
  656.         setUp(FALSE);
  657.         if (expert)   break;
  658.     case '?':
  659.         tutorial("readopt.mnu");
  660.         abort    = TRUE;
  661.         break;
  662.     }
  663.     first = '\0';
  664.     } while (!done && moreYet && !abort);
  665.  
  666.     if (abort) return;
  667.  
  668.     if (status) {
  669.     systat();
  670.     return;
  671.     }
  672.  
  673.     if (doDir) {
  674.     FDSectCount    = 0;      /* global fDir() totals sectors in   */
  675.     getNormStr("", fileName, NAMESIZE, ECHO);
  676.  
  677.     if (strLen(fileName))    wildCard(fDir, fileName);
  678.     else            wildCard(fDir, "*.*"   );
  679.  
  680.     mPrintf("\n Approximately %ld sectors total\n ", FDSectCount);
  681.     return;
  682.     }
  683.  
  684.     if (hostFile) {
  685.     getNormStr("afn", fileName, NAMESIZE, ECHO);
  686.     usingWCprotocol = WC;
  687.     wildCard((formatted) ? formatFile : transmitFile, fileName);
  688.     usingWCprotocol = FALSE;
  689.     return;
  690.     }
  691.  
  692.     doCR();
  693.     if (WC) {
  694.     download(whichMess, revOrder);
  695.     return;
  696.     }
  697.  
  698.     if (whichMess != GLOBALnEW)   {
  699.     showMessages(whichMess, revOrder);
  700.     } else {
  701.     while (outFlag != OUTSKIP   &&     gotoRoom("", 'R'))   {
  702.         givePrompt();
  703.         mPrintf("read new\n ");
  704.         showMessages(NEWoNLY, revOrder);
  705.     }
  706.     }
  707. }
  708.  
  709. /************************************************************************/
  710. /*    doRegular()                            */
  711. /************************************************************************/
  712. char doRegular(x, c)
  713. char x, c;
  714. {
  715.     char toReturn;
  716.  
  717.     toReturn = FALSE;
  718.  
  719.     switch (c) {
  720.  
  721.     case 'C': doChat(  x, '\0');            break;
  722.     case 'E': doEnter( x, 'm' );            break;
  723.     case 'F': doRead(  x, 'f' );            break;
  724.     case 'G': doGoto(  x, '\0');            break;
  725.     case 'H': doHelp(  x, '\0');            break;
  726.     case 'K': doKnown( x, '\0');            break;
  727.     case 'L': doLogin( x, '\0');            break;
  728.     case 'N': doRead(  x, 'n' );            break;
  729.     case 'O': doRead(  x, 'o' );            break;
  730.     case 'R': doRead(  x, 'r' );            break;
  731.     case 'S': doSkip(  x, '\0');            break;
  732.     case 'T': doLogout(x, 'q' );            break;
  733.     case 'U': doUngoto(x, '\0');            break;
  734.  
  735.     case 0:
  736.     if (newCarrier)   {
  737.         greeting();
  738.         newCarrier    = FALSE;
  739.     }
  740.     if (justLostCarrier) {
  741.         justLostCarrier = FALSE;
  742.         if (loggedIn) terminate(FALSE);
  743.     }
  744.     break;    /* irrelevant value */
  745.     case '?':
  746.     tutorial("mainopt.mnu");
  747.     if (whichIO == CONSOLE)   mPrintf("\n^l: SysOp privileged fns\n ");
  748.     break;
  749.  
  750.     case 'A': if (!doAide(x, 'E'))  toReturn=TRUE;    break;
  751.     case 'Z': doForget(x, '\0');              break;
  752.     default:
  753.     toReturn=TRUE;
  754.     break;
  755.     }
  756.     return  toReturn;
  757. }
  758.  
  759. /************************************************************************/
  760. /*    doSkip() handles the <S>kip a room command            */
  761. /************************************************************************/
  762. doSkip(expand, first)
  763. char first, expand;
  764. {
  765.     label roomName;             /* In case of ".Skip" */
  766.  
  767.     outFlag = IMPERVIOUS;
  768.     mPrintf("kip %s> goto ", roomTab[thisRoom].rtname);
  769.     if (expand)
  770.     getNormStr("", roomName, NAMESIZE, ECHO);
  771.     else
  772.     roomName[0] = '\0';
  773.     if (roomName[0] == '?')
  774.     tutorial("skip.hlp");
  775.     else {
  776.     roomTab[thisRoom].rtflags.SKIP = 1;    /* Set bit */
  777.     gotoRoom(roomName, 'S');
  778.     }
  779. }
  780.  
  781. /************************************************************************/
  782. /*    doSysop() handles the sysop-only menu                */
  783. /*        return FALSE to fall invisibly into default error msg    */
  784. /************************************************************************/
  785. char doSysop(c, first)
  786. char c;
  787. char first;    /* first parameter if TRUE        */
  788. {
  789.     char        *netVersion();
  790.     label        who;
  791.     struct logBuffer    lBuf;
  792.     int         logNo, ltabSlot;
  793.  
  794.     if (!onConsole)   return TRUE;
  795.  
  796.     while (TRUE)   {
  797.  
  798.     mPrintf("\n privileged fn: ");
  799.  
  800.     switch (toUpper(   first ? first : iChar()    )) {
  801.     case 'Z':
  802.         mPeek(); break;
  803.     case 'E':
  804.         mPrintf("cho %sabled\n ", (anyEcho = !anyEcho) ? "en" : "dis");
  805.         break;
  806.     case 'A':
  807.         mPrintf("bort\n ");
  808.         return FALSE;
  809.     case 'C':
  810.         mPrintf("hat mode %sabled\n ",
  811.         (cfg.noChat = !cfg.noChat)
  812.         ?
  813.         "dis"
  814.         :
  815.         "en"
  816.         );
  817.         break;
  818.     case 'D':
  819.         cfg.debug = !cfg.debug;
  820.         mPrintf("ebug switch=%d\n \n", cfg.debug);
  821.         break;
  822.     case 'I':
  823.         mPrintf("nformation\n ");
  824.         mPrintf("Citadel-86 V%s\n Net version %s", VERSION, netVersion());
  825.         mPrintf("\n Commands version %d.%d\n ", majorVers(), fixVers());
  826.         mPrintf("ctdlcnfg.sys version %d\n ", cfg.paramVers);
  827.         break;
  828.     case 'K':
  829.         mPrintf("ill account\n ");
  830.         getNormStr("who", who, NAMESIZE, ECHO);
  831.         logNo   = findPerson(who, &lBuf);
  832.         if (logNo == ERROR)   {
  833.         mPrintf("No such person\n ");
  834.         break;
  835.         }
  836.         if (lBuf.credit != 0)
  837.         mPrintf("%s has %d credit for l-d!", who);
  838.         if (!getYesNo("Confirm"))    break;
  839.         mPrintf(
  840.         "%s deleted\n ",
  841.         who
  842.         );
  843.         ltabSlot = PWSlot(lBuf.lbpw, /* load == */ FALSE);
  844.         lBuf.lbname[0] = '\0';
  845.         lBuf.lbpw[0  ] = '\0';
  846.         lBuf.lbflags.L_INUSE = FALSE;
  847.  
  848.         putLog(&lBuf, logNo);
  849.  
  850.         logTab[ltabSlot].ltpwhash        = 0;
  851.         logTab[ltabSlot].ltnmhash        = 0;
  852.  
  853.         break;
  854.     case 'M':
  855.         mPrintf("\bSystem now on MODEM\n ");
  856.         whichIO = MODEM;
  857.         setUp(FALSE);
  858.         mPrintf("Chat mode %sabled\n ", cfg.noChat    ?  "dis"  :  "en");
  859.         if (cfg.debug)     mPrintf("Debug mode on\n "  );
  860. #ifdef NEED_VISIBLE
  861.         if (visibleMode) mPrintf("Visible mode on\n ");
  862. #endif
  863.         return FALSE;
  864.     case 'P':
  865.         mPrintf("\baide privilege set/clear\n ");
  866.         getNormStr("who", who, NAMESIZE, ECHO);
  867.         logNo   = findPerson(who, &lBuf);
  868.         if (logNo == ERROR)   {
  869.         mPrintf("No such person\n ");
  870.         break;
  871.         }
  872.  
  873.         if (lBuf.lbflags.AIDE == 1)
  874.         lBuf.lbflags.AIDE = 0;
  875.         else
  876.         lBuf.lbflags.AIDE = 1;
  877.         mPrintf(
  878.         "%s %s aide privileges\n ",
  879.         who,
  880.         (lBuf.lbflags.AIDE == 1)  ?  "gets"  :    "loses"
  881.         );
  882.         if (!getYesNo("Confirm"))    break;
  883.  
  884.         putLog(&lBuf, logNo);
  885.  
  886.         /* see if it is us: */
  887.         if (loggedIn  &&  strCmpU(logBuf.lbname, who)==SAMESTRING)     {
  888.         aide = (lBuf.lbflags.AIDE == 1) ? TRUE : FALSE;
  889.         logBuf.lbflags.AIDE = (aide)    ? TRUE : FALSE;
  890.         }
  891.         break;
  892.     case 'S':
  893.         changeDate();
  894.         break;
  895. #ifdef NEED_VISIBLE
  896.     case 'V':
  897.         mPrintf(" VisibleMode==%d\n ",  visibleMode = !visibleMode);
  898.         break;
  899. #endif
  900.     case 'X':
  901.         mPrintf("\bexit to MS-DOS\n \n");
  902.         ExitToMsdos = TRUE;
  903.         exitValue    = SYSOP_EXIT;
  904.         return FALSE;
  905.     case 'N':
  906.         netStuff();
  907.         break;
  908.     case 'R':
  909.         mPrintf("einitialize Modem\n ");
  910.         modemInit();
  911.         break;
  912.     case 'Q':
  913.         cfg.oldest = getNumber(" Set oldest to", 0, 32000);
  914.         break;
  915.     case '?':
  916.         tutorial("ctdlopt.mnu");
  917.         break;
  918.     default:
  919.         if (!expert)    mPrintf(" ?(Type '?' for menu)\n "        );
  920.         else        mPrintf(" ?\n "                );
  921.         break;
  922.     }
  923.     }
  924. }
  925.  
  926. /************************************************************************/
  927. /*    doUngoto() handles the Ungoto command                */
  928. /************************************************************************/
  929. doUngoto(c, first)
  930. char c;
  931. char first;    /* first parameter if TRUE        */
  932. {
  933.     mPrintf("ngoto\n ");
  934.     if (lastRoom == -1) {
  935.     mPrintf("No room to Ungoto to!\n ");
  936.     return;
  937.     }
  938.     retRoom();
  939. }
  940.  
  941. /************************************************************************/
  942. /*    getCommand() prints menu prompt and gets command char        */
  943. /*    Returns: char via parameter and expand flag as value  --    */
  944. /*         i.e., TRUE if parameters follow else FALSE.        */
  945. /************************************************************************/
  946. char getCommand(c)
  947. char *c;
  948. {
  949.     char BBSCharReady();
  950.     char expand;
  951.  
  952.     outFlag = OUTOK;
  953.  
  954.     givePrompt();
  955.  
  956.     *c = toUpper(iChar());
  957.  
  958.     expand  = (
  959.     *c == ' '
  960.     ||
  961.     *c == '.'
  962.     ||
  963.     *c == ','
  964.     ||
  965.     *c == '/'
  966.     );
  967.     if (expand) *c = toUpper(iChar());
  968.  
  969.     if (justLostCarrier) {
  970.     justLostCarrier = FALSE;
  971.     if (loggedIn) terminate(FALSE);
  972.     }
  973.     return expand;
  974. }
  975.  
  976. /************************************************************************/
  977. /*    greeting() gives system-entry blurb etc             */
  978. /************************************************************************/
  979. greeting()
  980. {
  981.     if (loggedIn) terminate(FALSE);
  982.  
  983.     setUp(TRUE);     pause(10);
  984.  
  985.     setmem(audit, AUDIT, ' ');
  986.     acount = 0;
  987.  
  988.     mPrintf("\n Welcome to %s", cfg.codeBuf + cfg.nodeTitle);
  989.     mPrintf("\n Running: Citadel-86 (V%s) \n \n", VERSION);
  990.     printDate();
  991.     mPrintf("\n H for Help\n ");
  992.  
  993.     printf("Chat mode %sabled\n", cfg.noChat ? "dis" : "en");
  994.     printf("\n 'MODEM' mode.\n "               );
  995.     printf("(<ESC> for CONSOLE mode.)\n "           );
  996.     while (MIReady())
  997.     inp();
  998.  
  999.     gotoRoom(baseRoom, 'R');
  1000. }
  1001.  
  1002. /************************************************************************/
  1003. /*    main() contains the central menu code                */
  1004. /************************************************************************/
  1005. main(argc, argv)
  1006. int  argc;
  1007. char **argv;
  1008. {
  1009.     char c, x;
  1010.     char getCommand();
  1011.     
  1012.     /* don't put any code above init()... readSysTab() will defeat it.    */
  1013.     cfg.weAre        = CITADEL;
  1014.     initCitadel();
  1015.     greeting();
  1016.  
  1017.     if (argc >= 2) {
  1018.     sPrintf(msgBuf.mbtext,
  1019.  "System brought up from apparent crash. See header for time it came up.");
  1020.     aideMessage(FALSE);
  1021.     }
  1022.  
  1023.  
  1024.     while (!ExitToMsdos)  {
  1025.     x    = getCommand(&c);
  1026.  
  1027.     outFlag = OUTOK;
  1028.  
  1029.     if ((c==CNTRLl)  ?  doSysop(0, '\0')  :  doRegular(x, c))  {
  1030.         if (!expert)    mPrintf(" ? (Type '?' for menu)\n \n"   );
  1031.         else        mPrintf(" ?\n \n"                );
  1032.     }
  1033.     }
  1034.     if (loggedIn) terminate( /* hangUp == */ TRUE);
  1035.     writeSysTab(); 
  1036.     exit(exitValue);
  1037. }
  1038.